/**
 * 在JS中，call、apply、bind都是用来改变函数的this对象的指向的，他们有什么样的区别呢。
 * 在说区别之前先总结一下三者的相似之处：
 * 1、都是用来改变函数的this对象的指向的。(改变作用域)
 * 2、第一个参数都是this要指向的对象。
 * 3、都可以利用后续参数传参。
 * @constructor
 */
var xw = {
    name: '张三',
    age : 23,
    // say:function(){
    //     console.log(this.name+","+this.age);
    //}
    say : function (gender, school) {
        console.log(this.name + ',' + gender + ',' + this.age + ',' + school);
    }
}

var xh = {
    name: '小红',
    age : 22
}
/**
 * 如果直接写xw.say.bind(xh)是不会有任何结果的，call和apply都是对函数的直接调用，而bind方法返回的仍然是一个函数，因此后面还需要()来进行调用才可以
 */
//call()
xw.say.call(xh);
//apply()
xw.say.apply(xh)
//bind()
xw.say.bind(xh)()

/**
 * call()和appl()区别
 * call后面的参数与say方法中是一一对应的，而apply的第二个参数是一个数组，数组中的元素是和say方法中一一对应的，这就是两者最大的区别。
 */
xw.say.call(xh, '女', '巴蜀中学');
xw.say.apply(xh, ['女', '巴蜀中学']);
xw.say.bind(xh)('女', '人和中学');//xw.say.bind(xh,'女','人和中学')
